package io.vividcode.happyride.triphistoryservice.domain;

import io.vividcode.happyride.passengerservice.api.events.PassengerDetails;
import io.vividcode.happyride.triphistoryservice.dataaccess.TripRepository;
import io.vividcode.happyride.tripservice.api.TripState;
import io.vividcode.happyride.tripservice.api.events.TripDetails;

import java.util.List;
import java.util.function.Consumer;

import jakarta.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
@Transactional
public class TripService {

    @Autowired
    TripRepository tripRepository;

    public List<Trip> findByPassenger(final String passengerId) {
        return this.tripRepository.findByPassengerId(passengerId);
    }

    public List<Trip> findByDriver(final String driverId) {
        return this.tripRepository.findByDriverId(driverId);
    }

    public void createTrip(final String tripId, final TripDetails tripDetails) {
        final Trip trip = new Trip();
        trip.setId(tripId);
        trip.setPassengerId(tripDetails.getPassengerId());
        trip.setStartPosLat(tripDetails.getStartPos().getLat());
        trip.setStartPosLng(tripDetails.getStartPos().getLng());
        trip.setEndPosLat(tripDetails.getEndPos().getLat());
        trip.setEndPosLng(tripDetails.getEndPos().getLng());
        trip.setState(TripState.CREATED);
        this.tripRepository.save(trip);
    }

    public void updatePassengerDetails(final String passengerId,
                                       final PassengerDetails passengerDetails) {
        this.tripRepository
                .updatePassengerDetails(passengerId,
                        passengerDetails.getPassengerName());
    }

    public void updateTripState(final String tripId, final TripState state) {
        this.withTrip(tripId, trip -> {
            trip.setState(state);
            this.tripRepository.save(trip);
        });
    }

    public void setTripDriver(final String tripId, final String driverId) {
        this.withTrip(tripId, trip -> {
            trip.setDriverId(driverId);
            this.tripRepository.save(trip);
        });
    }

    private void withTrip(final String tripId, final Consumer<Trip> consumer) {
        this.tripRepository.findById(tripId).ifPresent(consumer);
    }
}
